#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//struct ListNode
//{
//    int data;
//    struct ListNode*next;
//};
//struct ListNode*reverse( struct ListNode*phead)
//{
//    struct ListNode*n1=NULL;
//    struct ListNode*cur=phead;
//    while(cur)
//    {
//        struct ListNode*next=cur->next;
//        cur->next=n1;
//        n1=cur;
//        cur=next;
//    }
//
//    return n1;
//}
//
//int main()
//{
//
//    struct ListNode*n1= (struct ListNode*)malloc(sizeof(struct ListNode));
//    struct ListNode*n2= (struct ListNode*)malloc(sizeof(struct ListNode));
//    struct ListNode*n3= (struct ListNode*)malloc(sizeof(struct ListNode));
//    struct ListNode*n4= (struct ListNode*)malloc(sizeof(struct ListNode));
//    struct ListNode*n5= (struct ListNode*)malloc(sizeof(struct ListNode));
//    struct ListNode*n6= (struct ListNode*)malloc(sizeof(struct ListNode));
//
//    n1->data=1;
//    n2->data=2;
//    n3->data=3;
//    n4->data=4;
//    n5->data=5;
//    n6->data=6;
//
//
//    n1->next=n2;
//    n2->next=n3;
//    n3->next=n4;
//    n4->next=n5;
//    n5->next=n6;
//    n6->next=NULL;
//
//    n1=reverse(n1);
//
//    return 0;
//}
//int compar(const void *p1,const void *p2)
//{
//    return (*(int*)p1)-(*(int*)p2);
//}
//int mini(int arr[],int k)
//{
//    qsort(arr,k,sizeof(arr[0]),compar);
//    return arr[0];
//}
//int main()
//{
//    int arr[]={9,8,7,6,5,4,3,2,1};
//    int k;
//    scanf("%d",&k);
//    int ret =mini(arr,k);
//    printf("%d",ret);
//    return 0;
//}

//int compar(const void *p1,const void *p2)
//{
//    return (*(int*)p1)-(*(int*)p2);
//}
//int number(int arr[],int sz)
//{
//    qsort(arr,sz,sizeof(arr[0]),compar);
//    int count=0;
//    int k =arr[0];
//    for(int i=0;i<sz;i++)
//    {
//
//        if(arr[i]==k)
//        {
//            count++;
//        }
//        else
//        {
//            if(count>=sz/2)
//                break;
//
//            k=arr[i];
//            count=1;
//        }
//
//    }
//    if(count>=sz/2)
//    return k;
//    else
//        return NULL;
//}
//int main()
//{
//    int arr[]={1,3,5,4,2,2};
//    int sz=sizeof(arr)/sizeof(arr[0]);
//    int  ret =number(arr,sz);
//
//    printf("%d",ret);
//    return 0;
//}

struct ListNode
{
    int data;
    struct ListNode*next;
};
struct ListNode* deleteDuplicates(struct ListNode* head)
{
    struct ListNode*fast=head;
    struct ListNode*slow=head;

    while(fast)
    {
        if(fast->data!=slow->data)
        {
            slow=slow->next;
            slow->data=fast->data;
        }
        fast=fast->next;
    }

    struct ListNode*next=slow->next;
    slow->next=NULL;
    while(next)
    {
        struct ListNode*nextnext=next->next;
        free(next);
        next=nextnext;
    }
    return head;
}

int main()
{

    struct ListNode*n1= (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode*n2= (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode*n3= (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode*n4= (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode*n5= (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode*n6= (struct ListNode*)malloc(sizeof(struct ListNode));

    n1->data=1;
    n2->data=1;
    n3->data=2;
    n4->data=3;
    n5->data=3;


    n1->next=n2;
    n2->next=n3;
    n3->next=n4;
    n4->next=n5;
    n5->next=NULL;

    n1=deleteDuplicates(n1);

    return 0;
}


